#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "listearbre.h"
#include "arbrehuffman.h"

void insertionListe(liste** list, arbre* abr) {
    if (*list == NULL || abr->val < (*list)->info->val) {
        liste* newElem = malloc(sizeof (liste));
        newElem->info = abr;
        newElem->suiv = *list;
        *list = newElem;
    } else {
        insertionListe(&((*list)->suiv), abr);
    }
}

/* 
 * Renvoi si la liste est vide.
 * @return 0 si non vide.
 */
int estVide(liste* list) {
    return list == NULL;
}

/* Insere en tête de liste
 * param pointeur sur la liste (appelé avec &list) et arbre à insérer
 */
void insererEnTete(liste** list, arbre* abr) {
    liste* newElem = malloc(sizeof (liste));
    newElem->info = abr;
    newElem->suiv = *list;
    *list = newElem;

}

arbre* pop(liste** file) {
    liste* l = *file;
    arbre* a = l->info;
    *file = l->suiv;
    free(l);
    return a;
}

int longList(liste* list) {
    int i = 0;
    liste* actuel = list;
    while (actuel != NULL) {
        i++;
        actuel = actuel->suiv;
    }
    return i;
}

liste* cloneListe(liste* source) {
    if (source == NULL)
        return NULL;
    else {
        liste* newElem = malloc(sizeof (liste));
        newElem->info = source->info;
        newElem->suiv = cloneListe(source->suiv);
        return newElem;
    }
}

void freelist(liste* list) {
    if (list != NULL) {
        freelist(list->suiv);
        free(list);
    }

}

int listeCmp(liste* liste1, liste* liste2) {

    if (liste1 == NULL && liste2 == NULL) {
        //printf("2null\n");
        return 1;
    } else if (liste1 == NULL) {
        //printf("liste1courte\n");
        return 0;
    } else if (liste2 == NULL) {
        //printf("liste2courte\n");
        return 0;
    } else {
        //printf("cmp %d-%d ### %s --- %s\n", liste1->info->val, liste2->info->val, liste1->info->lettre, liste2->info->lettre);
        return strcmp(liste1->info->lettre, liste2->info->lettre) == 0 &&
                liste1->info->val == liste2->info->val &&
                listeCmp(liste1->suiv, liste2->suiv);
    }
}
